home *** CD-ROM | disk | FTP | other *** search
- /*
- File: NamRslvr.cpp
-
- Contains: Implementation of Mac version of ODNameResolver class
-
- Owned by: Nick Pilch
-
- Copyright: © 1994 - 1996 by Apple Computer, Inc., all rights reserved.
-
- Change History (most recent first):
-
- <6> 6/20/96 JP 1323103: Removed an ASSERT & added optional
- logging
- <5> 5/24/96 jpa 1246074: SOM_CATCH --> SOM_TRY..SOM_ENDTRY
- <4> .04.1996 NP Change ObjectMaster #define for parsing.
- <3> 3/14/96 NP 1290949, 1291292: Fix memory leaks with
- whose and every clauses.
- <2> 1/15/96 TJ Cleaned Up
-
- To Do:
- In Progress:
-
- */
-
- #ifndef SOM_ODPart_xh
- #include "Part.xh"
- #endif
-
- #ifndef _ODDESUTL_
- #include <ODDesUtl.h>
- #endif
-
- #ifndef _DFLTACS_
- #include <DfltAcs.h>
- #endif
-
- #ifndef SOM_ODDesc_xh
- #include "ODDesc.xh"
- #endif
-
- #ifndef SOM_ODOSLToken_xh
- #include "ODOSLTkn.xh"
- #endif
-
- #ifndef SOM_ODObjectSpec_xh
- #include "ODObjSpc.xh"
- #endif
-
- #ifndef _SEPRIV_
- #include "SEPriv.h"
- #endif
-
- #ifndef _SEUTILS_
- #include "SEUtils.h"
- #endif
-
- #ifndef SOM_ODMessageInterface_xh
- #include "MssgIntf.xh"
- #endif
-
- #ifndef SOM_DefaultAccessorSI_xh
- #include "MssgSI.xh"
- #endif
-
- #ifndef SOM_ODSession_xh
- #include "ODSessn.xh"
- #endif
-
- #ifndef SOM_ODFrame_xh
- #include "Frame.xh"
- #endif
-
- #ifndef SOM_ODPartWrapper_xh
- #include "PartWrap.xh"
- #endif
-
- #ifndef SOM_ODSemanticInterface_xh
- #include "SemtIntB.xh"
- #endif
-
- #ifndef _TEMPSI_
- #include "TempSI.h"
- #endif
-
- #ifndef _OSLTOKEN_
- #include "OSLToken.h"
- #endif
-
- #ifndef _CNTXTOSL_
- #include "CntxtOSL.h"
- #endif
-
- #ifndef _EXCEPT_
- #include "Except.h"
- #endif
-
- #ifndef _OPENHASH_
- #include "OpenHash.h"
- #endif
-
- #ifndef _PLFMDEF_
- #include "PlfmDef.h"
- #endif
-
- #ifndef _SIHLPABS_
- #include "SIHlpAbs.h"
- #endif
-
- #ifndef _ODREGISTRY_
- #include "ODRgstry.xh"
- #endif
-
- #ifndef _DFLTACS_
- #include "DfltAcs.h"
- #endif
-
- #define VARIABLE_MACROS
- #define ODNameResolver_Class_Source
- #include <NamRslvr.xih>
-
- #ifndef SOM_ODExtension_xh
- #include <Extensn.xh>
- #endif
-
- #ifndef _ODDEBUG_
- #include "ODDebug.h"
- #endif
-
- #ifndef _ODMEMORY_
- #include "ODMemory.h"
- #endif
-
- #ifndef _ORDCOLL_
- #include "OrdColl.h"
- #endif
-
- #ifndef SOM_Module_OpenDoc_StandardExtensions_defined
- #include "StdExts.xh"
- #endif
-
- #ifndef SOM_Module_OpenDoc_StdDefs_defined
- #include <StdDefs.xh>
- #endif
-
- #pragma segment ODNameResolver
-
- #include "NamRslvB.cpp" // Platform-independent methods, if any
-
- //#undef LOGGING
- //#define LOGGING 1
-
- //==============================================================================
- // Some implementation pointers.
- //==============================================================================
- /*
-
- Format of an ODOSLToken:
-
- -descriptorType: typeUserToken
-
- -dataHandle is 12 bytes long. The first 8 bytes contain an ODDesc* and
- the second 8 bytes contain an embedded OSLContext.
-
- */
- //==============================================================================
- // Constants
- //==============================================================================
-
- const ODULong kNumPartsExpected = 20; // number of parts expected to be
- // involved in object spec resolution.
-
- //==============================================================================
- // Function prototypes
- //==============================================================================
- #define SKIPOMPARSE
- #ifdef SKIPOMPARSE
- extern "C" { // functions may be called from a .c file
- #endif
- CallbackCallerProc ReturnCallbackFuncCaller(OSLCallbackSelector whichCallback);
-
- ODStatic OSErr CallObjectAccessor(DescType desiredClass,
- const OSLToken* containerToken,
- DescType containerClass,
- DescType keyForm,
- const AEDesc* keyData,
- OSLToken* value,
- Boolean* procFound,
- long contextRefCon);
-
- ODStatic OSErr CallCountProc(DescType desiredClass,
- DescType containerClass,
- const OSLToken* container,
- long* result,
- long contextRefCon);
-
- ODStatic OSErr CallCompareProc(DescType oper,
- const AEDesc* obj1,
- const AEDesc* obj2,
- ODBoolean* result,
- long contextRefCon);
-
- ODStatic OSErr CallDisposeTokenProc(OSLToken* unneededToken,
- long contextRefCon);
-
- ODStatic OSErr CallMarkProc(const OSLToken* dToken,
- const OSLToken* markToken,
- long index,
- long contextRefCon);
-
- ODStatic OSErr CallGetMarkTokenProc(const OSLToken* dContainerToken,
- DescType containerClass,
- OSLToken* result,
- long contextRefCon);
-
- ODStatic OSErr CallAdjustMarksProc(long newStart,
- long newStop,
- const OSLToken* markToken,
- long contextRefCon);
-
- ODStatic OSErr CallGetErrDescProc(AEDesc** appDescPtr,
- long contextRefCon);
-
- ODStatic long GetAppDoesFlags(long contextRefCon);
- #ifdef SKIPOMPARSE
- }
- #endif
-
- ODPart* PartFromContext(OSLContext* context);
- ODFrame* FrameFromContext(OSLContext* context);
- static ODBoolean TokenDefaultCanHandle( Environment* ev,
- ODNameResolver* resolver, ODOSLToken* token );
- ODDesc* GetUserODToken(OSLToken* oslToken);
- void SetUserODToken(OSLToken* oslToken, ODDesc* odDesc);
- static void NewODToken( ODNameResolver* me, ODOSLToken* openDocToken,
- ODPart* part, ODFrame* frame, OSLToken* newToken);
-
- //==============================================================================
- // SIContext
- //==============================================================================
-
- class SIContext
- {
- public:
-
- SIContext(Environment* ev, ODPart* part, ODFrame* frame,
- ODNameResolver* resolver,
- ODBoolean isDefaultToken = kODFalse);
- ~SIContext();
-
- ODPart* GetPart() {return fPart;}
- ODFrame* GetFrame() {return fFrame;}
- ODNameResolver* GetNameResolver() {return fNameResolver;}
- ODBoolean IsDefaultToken() {return fIsDefaultToken;}
- void SetIsDefaultToken(ODBoolean isDefault)
- {fIsDefaultToken = isDefault;}
- private:
- ODPart* fPart;
- ODFrame* fFrame;
- ODNameResolver* fNameResolver;
- ODBoolean fIsDefaultToken;
- };
-
- SIContext::SIContext(Environment* ev, ODPart* part, ODFrame* frame ,
- ODNameResolver* resolver,
- ODBoolean isDefaultToken)
- {
- if (part)
- part->Acquire(ev);
- if (frame)
- frame->Acquire(ev);
- fPart = part;
- fFrame = frame;
- fNameResolver = resolver;
- fIsDefaultToken = isDefaultToken;
-
- LOG("SIContext created part=%8X, frame=%8X\n", fPart, fFrame);
- ASSERT_FRAME_MATCHES_PART( ev, frame, part );
- }
-
- SIContext::~SIContext()
- {
- Environment* ev = somGetGlobalEnvironment();
-
- LOG("SIContext destroyed part=%8X, frame=%8X\n", fPart, fFrame);
- TRY
- if (fPart)
- fPart->Release(ev);
- if (fFrame)
- fFrame->Release(ev);
- CATCH_ALL
- ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // DeleteAContext
- //------------------------------------------------------------------------------
-
- inline void DeleteAContext(OSLContext* context)
- {
- delete (SIContext*)(context->refCon);
- #if ODDebug
- context->refCon = 0x50FF8001;
- #endif
- // delete context;
- }
-
- //------------------------------------------------------------------------------
- // PartFromContext
- //------------------------------------------------------------------------------
-
- ODPart* PartFromContext(OSLContext* context)
- {
- ODPart* part = ((SIContext*)(context->refCon))->GetPart();
- LOG("Part %#8X returned from OSLContext\n", part);
- return part;
- }
-
- //------------------------------------------------------------------------------
- // FrameFromContext
- //------------------------------------------------------------------------------
-
- ODFrame* FrameFromContext(OSLContext* context)
- {
- ODFrame* frame = ((SIContext*)(context->refCon))->GetFrame();
- LOG("Frame %#8X returned from OSLContext\n", frame);
- return frame;
- }
-
- //------------------------------------------------------------------------------
- // SIContextFromOSLToken
- //
- // Return pointer to SIContext that is referenced from this OSLToken.
- //------------------------------------------------------------------------------
-
- static SIContext* SIContextFromOSLToken(ODNameResolver* resolver,
- const OSLToken* token)
- {
- WASSERT(token->dataHandle != kODNULL);
- OSLContext context;
- OSLGetTokenContext(token, &context);
- return (SIContext*)(context.refCon);
- }
-
- //------------------------------------------------------------------------------
- // SIContextFromToken
- //
- // Return pointer to SIContext that is referenced from this ODOSLToken.
- //------------------------------------------------------------------------------
-
- static SIContext* SIContextFromToken(ODNameResolver* resolver,
- ODOSLToken* token)
- {
- AEDesc tokenAsAEDesc;
- SIContext* retVal;
-
- WASSERT(token != kODNULL);
- THROW_IF_ERROR(ODDescToAEDesc(token, &tokenAsAEDesc));
- WASSERT(tokenAsAEDesc.dataHandle != kODNULL);
- retVal = SIContextFromOSLToken(resolver, &tokenAsAEDesc);
- AEDisposeDesc(&tokenAsAEDesc);
- return retVal;
- }
-
- //------------------------------------------------------------------------------
- // SetIsDefaultToken
- //------------------------------------------------------------------------------
-
- static void SetIsDefaultToken(ODNameResolver* resolver,
- ODOSLToken* token, ODBoolean isDefaultToken)
- {
- WASSERT(token != kODNULL);
- SIContext* sic = SIContextFromToken(resolver, token);
- WASSERT(sic != kODNULL);
- sic->SetIsDefaultToken(isDefaultToken);
- }
-
- //------------------------------------------------------------------------------
- // MakeNULLToken
- //------------------------------------------------------------------------------
-
- inline static void MakeNULLToken( OSLToken *theToken )
- {
- theToken->descriptorType = typeNull ;
- theToken->dataHandle = NULL ;
- }
-
- //==============================================================================
- // SIContextTableKey
- //==============================================================================
-
- struct SIContextTableKey
- {
- ODPart* fPart;
- ODFrame* fFrame;
- SIContextTableKey(ODPart* part, ODFrame* frame) {fPart = part;
- fFrame = frame;}
- };
-
- //==============================================================================
- // ODNameResolver
- //==============================================================================
-
- //------------------------------------------------------------------------------
- // ODNameResolver::somInit
- //------------------------------------------------------------------------------
-
- //------------------------------------------------------------------------------
- // ODNameResolver::InitNameResolver
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODNameResolverInitNameResolver(ODNameResolver *somSelf, Environment *ev,
- ODSession* session)
- {
- ODNameResolverData *somThis = ODNameResolverGetData(somSelf);
- ODNameResolverMethodDebug("ODNameResolver","ODNameResolverInitNameResolver");
-
- SOM_TRY
-
- /* Moved from somInit. SOM itself sets fields to zero
- _fRootContext.getCallerProc = kODNULL;
- _fRootContext.refCon = 0;
- _fCurrentlyResolving = 0;
- _fSession = kODNULL;
- _fContextTable = kODNULL;
- _fCurrentContextPart = kODNULL;
- _fHashTableRefCount = 0;
- */
-
- somSelf->InitObject(ev);
-
- _fSession = session;
-
- const ODUShort kODOSLContextSize = sizeof(OSLContext);
- const ODBoolean kNotInSystemHeap = kODFalse;
- ODFrame* const kNoFrameInfo = kODNULL;
-
- somSelf->CreateContext(ev, kODAppShell, kNoFrameInfo, &_fRootContext);
- THROW_IF_ERROR(OSLObjectInit(&_fRootContext));
- THROW_IF_NULL(_fContextTable = new OpenHashTable(OpenHashTable::EqualTwoLongs, OpenHashTable::HashTwoLongs) );
- _fContextTable->Initialize(kNumPartsExpected, sizeof(SIContextTableKey),
- kODOSLContextSize);
- _fCurrentContextPart = new OrderedCollection;
- somSelf->AddNewContextPartToTopOfStack(ev, (ODPart*)kODAppShell);
- // _fCurrentContextPart = kODAppShell;
- _fErrDescList = new OrderedCollection;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // ODNameResolver::somUninit
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODNameResolversomUninit(ODNameResolver *somSelf)
- {
- ODNameResolverData *somThis = ODNameResolverGetData(somSelf);
- ODNameResolverMethodDebug("ODNameResolver","somUninit");
-
- TRY
- // somSelf->FlushContextCache(somGetGlobalEnvironment());
- // It is incorrect to call methods on somSelf inside somUninit,
- // a subclass may have already been somUninited. See OpenDoc Building Code for details.
- // Instead the implementation of FlushContextCache has been copied here.
-
- if (_fContextTable)
- {
- // BEGIN copy of FlushContextCache implementation
- OSLContext value;
- OpenHashTableIterator i(_fContextTable);
-
- if (_fHashTableRefCount == 0)
- for (i.First((void*) 0, &value); i.IsNotComplete(); i.Next((void*) 0, &value))
- {
- DeleteAContext(&value);
- i.RemoveCurrent();
- }
- // END copy of FlushContextCache implementation
- }
-
- CATCH_ALL
- ENDTRY
-
- DeleteAContext(&_fRootContext);
- ODDeleteObject(_fContextTable);
- ODDeleteObject(_fCurrentContextPart);
- ODDeleteObject(_fErrDescList);
- }
- #if 0
- //------------------------------------------------------------------------------
- // ODNameResolver::Purge
- //------------------------------------------------------------------------------
-
- SOM_Scope ODSize SOMLINK ODNameResolverPurge(ODNameResolver *somSelf, Environment *ev,
- ODSize size)
- {
- // ODNameResolverData *somThis = ODNameResolverGetData(somSelf);
- ODNameResolverMethodDebug("ODNameResolver","ODNameResolverPurge");
-
- ODUnused(size);
- return 0;
- }
- #endif /* 0 */
- //------------------------------------------------------------------------------
- // ODNameResolver::AddErrDescToList
- //------------------------------------------------------------------------------
-
- struct ErrorDescRec
- {
- AEDesc aeDesc;
- ODDesc* odDesc;
- };
-
- SOM_Scope AEDesc* SOMLINK ODNameResolverAddErrDescToList(ODNameResolver *somSelf, Environment *ev,
- ODDesc* odDesc)
- {
- ODNameResolverData *somThis = ODNameResolverGetData(somSelf);
- ODNameResolverMethodDebug("ODNameResolver","AddErrDescToList");
-
- ErrorDescRec* descRec = new ErrorDescRec;
- descRec->odDesc = odDesc;
- THROW_IF_ERROR(ODDescToAEDesc(odDesc, &descRec->aeDesc));
- _fErrDescList->AddFirst(descRec);
- return &descRec->aeDesc;
- }
-
- //------------------------------------------------------------------------------
- // ODNameResolver::Resolve
- //------------------------------------------------------------------------------
-
- // FOR CallGetErrDescProc. WE REALLY SHOULD BE KEEPING A LIST OF THESE FOR EVERY
- // PART. OSL WILL WRITE INTO THE DESCRIPTOR IF IT IS A NULL DESCRIPTOR.
- // IF AN APP RETURNS A NON-NULL DESCRIPTOR, THEN THE OSL WILL NOT WRITE INTO
- // IT (ASSUMING THAT IT WAS A PREVIOUSLY WRITTEN-INTO ONE?
-
- SOM_Scope void SOMLINK ODNameResolverResolve(ODNameResolver *somSelf, Environment *ev,
- ODObjectSpec* theObject, ODOSLToken* token, ODPart* contextPart)
- {
- ODNameResolverData *somThis = ODNameResolverGetData(somSelf);
- ODNameResolverMethodDebug("ODNameResolver","Resolve");
-
- OSLContext context;
- OSErr error;
- ODFrame* const kNoFrameInfo = kODNULL;
- ODBoolean contextPartStackChanged = kODFalse;
-
- SOM_TRY
- somSelf->AddNewContextPartToTopOfStack(ev, contextPart);
- contextPartStackChanged = kODTrue;
-
- ODSemanticInterface* theSI = somSelf->AcquireSemtIntf(ev, contextPart);
- if (!theSI)
- THROW(errAENoSuchObject);
- else if (contextPart != kODAppShell)
- theSI->Release(ev);
-
- somSelf->GetContextForPart(ev, contextPart, kNoFrameInfo, &context);
-
- AEDesc objectSpecifier;
- THROW_IF_ERROR( ODDescToAEDesc( theObject, &objectSpecifier ) );
-
- #ifdef TESTING_EXMN
- // replace the null desc at the root of containment with 'exmn'
- (void)Munger( objectSpecifier.dataHandle, 0, "null", 4, "exmn", 4 );
- #endif
-
- AEDesc realToken = NULL_DESCRIPTOR_DEFINITION;
-
- ++_fCurrentlyResolving;
- error = OSLResolve(&objectSpecifier, &realToken, &context);
- --_fCurrentlyResolving;
-
- AEDisposeDesc(&objectSpecifier);
- if (error == noErr)
- error = AEDescToODDesc( &realToken, token );
- AEDisposeDesc(&realToken);
-
- somSelf->DeleteTopOfContextPartStack(ev);
-
- THROW_IF_ERROR (error);
- SOM_CATCH_ALL
- if (contextPartStackChanged)
- somSelf->DeleteTopOfContextPartStack(ev);
- SOM_ENDTRY
-
- TRY
- OrderedCollectionIterator iter(_fErrDescList);
- ErrorDescRec* element;
-
- for (element = (ErrorDescRec*)iter.First();
- iter.IsNotComplete();
- element = (ErrorDescRec*)iter.Next())
- {
- AEDescToODDesc(&element->aeDesc, element->odDesc);
- AEDisposeDesc(&element->aeDesc);
- }
- _fErrDescList->DeleteAll();
- CATCH_ALL
- _fErrDescList->DeleteAll();
- ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // ODNameResolver::AcquireSemtIntf
- //
- // Convenience function. Returns the SemanticInterface object associated with
- // an ODPart object or kODNULL if none exists.
- //------------------------------------------------------------------------------
-
- SOM_Scope ODSemanticInterface* SOMLINK ODNameResolverAcquireSemtIntf(ODNameResolver *somSelf, Environment *ev,
- ODPart* part)
- {
- ODNameResolverData *somThis = ODNameResolverGetData(somSelf);
- ODNameResolverMethodDebug("ODNameResolver","AcquireSemtIntf");
-
- ODSemanticInterface* theSI;
-
- if (part == kODAppShell)
- theSI = _fSession->AcquireShellSemtInterface(ev);
- else
- {
- if (part->HasExtension(ev, kODExtSemanticInterface))
- theSI = (ODSemanticInterface*)part->AcquireExtension(ev,
- kODExtSemanticInterface);
- else
- theSI = kODNULL;
- }
-
- return theSI;
- }
-
- //------------------------------------------------------------------------------
- // ODNameResolver::GetSession
- //
- // Convenience function. Returns the SemanticInterface object associated with
- // an ODPart object or kODNULL if none exists.
- //------------------------------------------------------------------------------
-
- SOM_Scope ODSession* SOMLINK ODNameResolverGetSession(ODNameResolver *somSelf, Environment *ev)
- {
- ODNameResolverData *somThis = ODNameResolverGetData(somSelf);
- ODNameResolverMethodDebug("ODNameResolver","GetSession");
-
- return _fSession;
- }
-
- //------------------------------------------------------------------------------
- // ODNameResolver::GetPartFromToken
- //------------------------------------------------------------------------------
-
- SOM_Scope ODPart* SOMLINK ODNameResolverGetPartFromToken(ODNameResolver *somSelf, Environment *ev,
- OSLToken* token)
- {
- // ODNameResolverData *somThis = ODNameResolverGetData(somSelf);
- ODNameResolverMethodDebug("ODNameResolver","ODNameResolverGetPartFromToken");
-
- OSLContext context;
- ODPart* part;
-
- if (OSErr error = OSLGetTokenContext(token, &context))
- {
- part = kODNULL;
- ODSetSOMException(ev, error);
- }
- else
- part = PartFromContext(&context);
-
- ASSERT_FRAME_MATCHES_PART( ev, FrameFromContext(&context), part );
- return part;
- }
-
- //------------------------------------------------------------------------------
- // ODNameResolver::AddNewContextPartToTopOfStack
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODNameResolverAddNewContextPartToTopOfStack(ODNameResolver *somSelf, Environment *ev,
- ODPart* contextPart)
- {
- ODNameResolverData *somThis = ODNameResolverGetData(somSelf);
- ODNameResolverMethodDebug("ODNameResolver","AddNewContextPartToTopOfStack");
-
- _fCurrentContextPart->AddFirst(contextPart);
- }
-
- //------------------------------------------------------------------------------
- // ODNameResolver::DeleteTopOfContextPartStack
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODNameResolverDeleteTopOfContextPartStack(ODNameResolver *somSelf, Environment *ev)
- {
- ODNameResolverData *somThis = ODNameResolverGetData(somSelf);
- ODNameResolverMethodDebug("ODNameResolver","DeleteTopOfContextPartStack");
-
- _fCurrentContextPart->RemoveFirst();
- }
-
- //------------------------------------------------------------------------------
- // ODNameResolver::GetCurrentContextPart
- //------------------------------------------------------------------------------
-
- SOM_Scope ODPart* SOMLINK ODNameResolverGetCurrentContextPart(ODNameResolver *somSelf, Environment *ev)
- {
- ODNameResolverData *somThis = ODNameResolverGetData(somSelf);
- ODNameResolverMethodDebug("ODNameResolver","ODNameResolverGetCurrentContextPart");
-
- OSLContext curContext;
-
- // IF WE'RE IN THE OSL, THE OSL IS DETERMINING THE CONTEXT. OTHERWISE, WE
- // KEEP THAT STATE.
- if (_fCurrentlyResolving)
- {
- THROW_IF_ERROR(GetCurrentContext(&curContext));
- return PartFromContext(&curContext);
- }
- else
- // return _fCurrentContextPart;
- return (ODPart*)_fCurrentContextPart->First();
- }
-
- //------------------------------------------------------------------------------
- // ODNameResolver::SetCurrentContextPart
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODNameResolverSetCurrentContextPart(ODNameResolver *somSelf, Environment *ev,
- ODPart* part)
- {
- ODNameResolverData *somThis = ODNameResolverGetData(somSelf);
- ODNameResolverMethodDebug("ODNameResolver","ODNameResolverSetCurrentContextPart");
-
- // DON'T ALLOW SETTING INTERNAL OSL STATE.
- ASSERTM(!_fCurrentlyResolving, kODErrUndefined, "ODNameResolver: SetCurrentContextPart: Unexpected State.");
- // $$$$$ NEED TO DO REFCOUNTING HERE
- _fCurrentContextPart->RemoveFirst();
- _fCurrentContextPart->AddFirst(part);
- // _fCurrentContextPart = part;
- }
-
- //------------------------------------------------------------------------------
- // ODNameResolver::GetContextForPart
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODNameResolverGetContextForPart(ODNameResolver *somSelf, Environment *ev,
- ODPart* part,
- ODFrame* frame,
- OSLContext* context)
- {
- ODNameResolverData *somThis = ODNameResolverGetData(somSelf);
- ODNameResolverMethodDebug("ODNameResolver","ODNameResolverGetContextForPart");
-
- SOM_TRY
-
- OSLContext localContext;
- SIContextTableKey key(part, frame);
-
- // if (frame)
- ASSERT_FRAME_MATCHES_PART( ev, frame, part );
-
- if (part == kODAppShell)
- *context = _fRootContext;
- else if (_fContextTable->GetValue(&key, context))
- ;
- else
- {
- somSelf->CreateContext(ev, part, frame, &localContext);
- _fContextTable->ReplaceEntry(&key, &localContext);
- *context = localContext;
- }
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // ODNameResolver::CreateContext
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODNameResolverCreateContext(ODNameResolver *somSelf, Environment *ev,
- ODPart* part,
- ODFrame* frame,
- OSLContext* context)
- {
- // ODNameResolverData *somThis = ODNameResolverGetData(somSelf);
- ODNameResolverMethodDebug("ODNameResolver","ODNameResolverCreateContext");
-
- SOM_TRY
-
- SIContext* siContext;
-
- context->getCallerProc = ReturnCallbackFuncCaller;
-
- ASSERT_FRAME_MATCHES_PART( ev, frame, part );
- siContext = new SIContext(ev, part, frame, somSelf);
-
- context->refCon = (long)siContext;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // ODNameResolver::FlushContextCache
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODNameResolverFlushContextCache(ODNameResolver *somSelf, Environment *ev)
- {
- ODNameResolverData *somThis = ODNameResolverGetData(somSelf);
- ODNameResolverMethodDebug("ODNameResolver","FlushContextCache");
-
- OSLContext value;
- OpenHashTableIterator i(_fContextTable);
-
- if (_fHashTableRefCount == 0)
- for (i.First((void*) 0, &value); i.IsNotComplete(); i.Next((void*) 0, &value))
- {
- DeleteAContext(&value);
- i.RemoveCurrent();
- }
- }
-
- //------------------------------------------------------------------------------
- // ODNameResolver::NeedContextCache
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODNameResolverNeedContextCache(ODNameResolver *somSelf, Environment *ev,
- ODBoolean lockIt)
- {
- ODNameResolverData *somThis = ODNameResolverGetData(somSelf);
- ODNameResolverMethodDebug("ODNameResolver","NeedContextCache");
-
- if (lockIt) {
- WASSERT(_fHashTableRefCount >= 0);
- ++_fHashTableRefCount;
- }
- else {
- --_fHashTableRefCount;
- WASSERT(_fHashTableRefCount >= 0);
- }
- }
-
- //------------------------------------------------------------------------------
- // ODNameResolver::TokenIsDefault
- //------------------------------------------------------------------------------
- SOM_Scope ODBoolean SOMLINK ODNameResolverTokenIsDefault(ODNameResolver *somSelf, Environment *ev,
- AEDesc* token )
- {
- ODNameResolverData *somThis = ODNameResolverGetData(somSelf);
- ODNameResolverMethodDebug("ODNameResolver","ODNameResolverTokenIsDefault");
-
- WASSERT( token->descriptorType == typeUserToken );
- return SIContextFromOSLToken(somSelf, token)->IsDefaultToken();
- }
-
- //------------------------------------------------------------------------------
- // GetUserODToken
- //
- // Get the "user" token from the token that the OSL passes around.
- //
- // The userToken is the first four bytes.
- //------------------------------------------------------------------------------
-
- ODDesc* GetUserODToken(OSLToken* oslToken)
- {
- return *((ODDesc**)(*(oslToken->dataHandle)));
- }
-
- //------------------------------------------------------------------------------
- // ODNameResolver::GetUserToken
- //
- // Optimization: Don't have make OD token into AEDesc. We know the format of
- // an OSLToken exactly. The ODDesc* will be in the first four bytes of the
- // data.
- //------------------------------------------------------------------------------
-
- SOM_Scope ODDesc* SOMLINK ODNameResolverGetUserToken(ODNameResolver *somSelf, Environment *ev,
- ODOSLToken* token)
- {
- // ODNameResolverData *somThis = ODNameResolverGetData(somSelf);
- ODNameResolverMethodDebug("ODNameResolver","ODNameResolverGetUserToken");
-
- ODDesc* retVal = kODNULL;
-
- SOM_TRY
- AEDesc tokenAsAEDesc;
-
- if ( token->GetDescType(ev) != typeUserToken)
- THROW( kODErrNotAnODToken );
-
- THROW_IF_ERROR(ODDescToAEDesc(token, &tokenAsAEDesc));
- retVal = GetUserODToken(&tokenAsAEDesc);
- AEDisposeDesc(&tokenAsAEDesc);
- #if 0
- AEDesc tokenAsAEDesc;
- THROW_IF_ERROR( ODDescToAEDesc( token, &tokenAsAEDesc ) );
- if ( tokenAsAEDesc.descriptorType != typeUserToken)
- // THROW( kODErrInvalidParameter );
-
- if ( tokenAsAEDesc.dataHandle == kODNULL)
- // THROW( kODErrInvalidParameter );
-
- AEDesc* userAEDesc = new AEDesc;
- // EXTRACT USER TOKEN FROM DATAHANDLE.
- *userAEDesc = *((AEDesc*)(*(tokenAsAEDesc.dataHandle)));
- AEDesc tempAEDesc;
- AEDuplicateDesc(userAEDesc, &tempAEDesc);
-
- ODDesc* userToken = new ODDesc();
- THROW_IF_NULL(userToken);
- userToken->InitODDesc(ev);
-
- THROW_IF_ERROR( AEDescToODDesc(userAEDesc, userToken ) );
- userToken->SetHadToAllocate(ev);
-
- *desc = userToken;
- #endif /* 0 */
- SOM_CATCH_ALL
- SOM_ENDTRY
-
- return retVal;
- }
-
- //------------------------------------------------------------------------------
- // ODNameResolver::IsODToken
- //------------------------------------------------------------------------------
-
- SOM_Scope ODBoolean SOMLINK ODNameResolverIsODToken(ODNameResolver *somSelf, Environment *ev,
- ODOSLToken* token)
- {
- // ODNameResolverData *somThis = ODNameResolverGetData(somSelf);
- ODNameResolverMethodDebug("ODNameResolver","ODNameResolverIsODToken");
- WASSERT( token );
- return token->GetDescType(ev) == typeUserToken;
- }
-
- //------------------------------------------------------------------------------
- // ODNameResolver::GetContextFromToken
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODNameResolverGetContextFromToken(ODNameResolver *somSelf, Environment *ev,
- ODOSLToken* token,
- ODPart** part,
- ODFrame** frame)
- {
- // ODNameResolverData *somThis = ODNameResolverGetData(somSelf);
- ODNameResolverMethodDebug("ODNameResolver","ODNameResolverGetContextFromToken");
-
- WASSERT(part);
- WASSERT(frame);
-
- SOM_TRY
- AEDesc realToken;
- THROW_IF_ERROR( ODDescToAEDesc( token, &realToken ) );
-
- WASSERT( realToken.descriptorType == typeUserToken );
- *part = kODNULL;
- *frame = kODNULL;
-
- // $$$$$This is really really really gross! Why the hell can't we define
- // a struct so we don't have to blindly grop around inside the handle?
- // I agree-NP-it will be done.
-
- OSLContext context = *(OSLContext*)
- ((*(realToken.dataHandle))+sizeof(ODDesc*));
- (void)AEDisposeDesc( &realToken );
- *part = PartFromContext(&context);
- *frame = FrameFromContext(&context);
- ASSERT_FRAME_MATCHES_PART( ev, *frame, *part );
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // ODNameResolver::CreateSwapToken
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODNameResolverCreateSwapToken(ODNameResolver *somSelf, Environment *ev,
- ODOSLToken* token,
- ODPart* part,
- ODFrame* frame)
- {
- ODNameResolverData *somThis = ODNameResolverGetData(somSelf);
- ODNameResolverMethodDebug("ODNameResolver","ODNameResolverCreateSwapToken");
-
- SOM_TRY
-
- // if (frame)
- ASSERT_FRAME_MATCHES_PART( ev, frame, part );
-
- OSLToken localToken ;
- THROW_IF_ERROR( ODDescToAEDesc( token, &localToken ) );
-
- OSLSetTokenDescType(&localToken, kSwitchDescType);
-
- OSLContext context;
-
- somSelf->GetContextForPart(ev, part, frame, &context);
- OSLSetTokenContext(&localToken, &context);
-
- THROW_IF_ERROR( AEDescToODDesc( &localToken, token ) );
- (void)AEDisposeDesc( &localToken );
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // ODNameResolver::CallObjectAccessor
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODNameResolverCallObjectAccessor(ODNameResolver *somSelf, Environment *ev,
- ODPart* part,
- ODDescType desiredClass,
- ODOSLToken* containerToken,
- ODDescType containerClass,
- ODDescType keyForm,
- ODDesc* keyData,
- ODOSLToken* token)
- {
- ODNameResolverData *somThis = ODNameResolverGetData(somSelf);
- ODNameResolverMethodDebug("ODNameResolver","ODNameResolverCallObjectAccessor");
-
- SOM_TRY
-
- OSLContext curContext;
-
- // CHECK THAT CURRENT CONTEXT IS THE SAME AS CONTEXT FOR thePart
- if (part != somSelf->GetCurrentContextPart(ev))
- THROW(errAEAccessorNotFound);
-
- THROW_IF_ERROR(GetCurrentContext(&curContext));
-
- // Don't bother putting anything *in* realToken since it'll just get
- // overwritten later (by NewODToken)
- AEDesc realToken = NULL_DESCRIPTOR_DEFINITION;
- #define FIX_ODNAMERESOLVERCALLOBJECTACCESSOR_LEAK 0
- #if FIX_ODNAMERESOLVERCALLOBJECTACCESSOR_LEAK
- // THIS IS SILLY. WE NEED TO REDESIGN NewODToken SO IT'S SMARTER ABOUT THIS.
- somSelf->DisposeToken(ev, token);
- token = new ODOSLToken();
- token->InitODOSLToken(ev);
- #endif
- AEDesc realContainer;
- THROW_IF_ERROR( ODDescToAEDesc( containerToken, &realContainer ) );
-
- AEDesc realData;
- THROW_IF_ERROR( ODDescToAEDesc( keyData, &realData ) );
-
- THROW_IF_ERROR(OSLCallObjectAccessor(desiredClass,
- &realContainer,
- containerClass,
- keyForm,
- &realData,
- &realToken));
- (void)AEDisposeDesc( &realContainer );
- (void)AEDisposeDesc( &realData );
-
- THROW_IF_ERROR( AEDescToODDesc(&realToken, token ) );
- (void)AEDisposeDesc( &realToken );
-
- THROW_IF_ERROR(SetCurrentContext(&curContext));
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // ODNameResolver::DisposeToken
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODNameResolverDisposeToken(ODNameResolver *somSelf, Environment *ev,
- ODOSLToken* theToken)
- {
- // ODNameResolverData *somThis = ODNameResolverGetData(somSelf);
- ODNameResolverMethodDebug("ODNameResolver","ODNameResolverDisposeToken");
-
- SOM_TRY
- // don't assert this: it could be a list too
- // WASSERT(somSelf->IsODToken(ev, theToken));
-
- OSLToken localToken;
- THROW_IF_ERROR( ODDescToAEDesc( theToken, &localToken ) );
- // NEED TO DELETE THE OBJECT HERE BECAUSE ONLY localToken GETS PASSED
- // BACK INTO OUR CODE FROM THE OSL.
- ODDeleteObject(theToken);
- THROW_IF_ERROR(OSLDisposeToken(&localToken));
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // ReturnCallbackFuncCaller
- //------------------------------------------------------------------------------
-
- CallbackCallerProc ReturnCallbackFuncCaller(OSLCallbackSelector whichCallback)
- {
- CallbackCallerProc result;
-
- switch(whichCallback)
- {
- case kObjectAccessor:
- result = (CallbackCallerProc)CallObjectAccessor;
- break;
- case kCallbackFlagsGetter:
- result = (CallbackCallerProc)GetAppDoesFlags;
- break;
- case kCountProc:
- result = (CallbackCallerProc)CallCountProc;
- break;
- case kCompareProc:
- result = (CallbackCallerProc)CallCompareProc;
- break;
- case kDisposeTokenProc:
- result = (CallbackCallerProc)CallDisposeTokenProc;
- break;
- case kGetMarkTokenProc:
- result = (CallbackCallerProc)CallGetMarkTokenProc;
- break;
- case kMarkProc:
- result = (CallbackCallerProc)CallMarkProc;
- break;
- case kAdjustMarksProc:
- result = (CallbackCallerProc)CallAdjustMarksProc;
- break;
- case kGetErrDescProc:
- result = (CallbackCallerProc)CallGetErrDescProc;
- break;
- default:
- ASSERTM(false, 0, "NamRslvr.ReturnCallbackFuncCaller: Reached default case in switch.");
- break;
- }
-
- return result;
- }
-
- //------------------------------------------------------------------------------
- // GetSI
- //
- // Given a context refCon, find the ODSemanticInterface object and the ODPart
- // object corresponding. If they can't be found, return kODFalse; return
- // kODTrue otherwise.
- //------------------------------------------------------------------------------
-
- static ODSemanticInterface* GetSI(long contextRefCon, ODPart** thePart)
- {
- ODNameResolver* nameResolver
- = ((SIContext*)contextRefCon)->GetNameResolver();
-
- *thePart = ((SIContext*)contextRefCon)->GetPart();
- return nameResolver->AcquireSemtIntf(somGetGlobalEnvironment(),*thePart);
- }
-
- //------------------------------------------------------------------------------
- // CreateNewODOSLToken
- //
- // This function shares a lot of code with NewODToken. Let's consolidate!
- // -NP 6/21/95
- //
- // Create an "OpenDoc token", one with context information and an embedded
- // ODDesc* for a user token.
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODNameResolverCreateNewODOSLToken(ODNameResolver *somSelf, Environment *ev,
- AEDesc* odOSLToken,
- ODDesc* userToken,
- ODPart* part,
- ODFrame* frame)
- {
- OSLContext context;
-
- somSelf->GetContextForPart(ev, part, frame, &context);
- odOSLToken->descriptorType = typeUserToken;
- odOSLToken->dataHandle = (Handle)ODNewHandle(sizeof(ODDesc*)
- + sizeof(OSLContext));
- OSLSetTokenContext(odOSLToken, &context);
- SetUserODToken(odOSLToken, userToken);
- }
-
- //------------------------------------------------------------------------------
- // NewODToken
- //
- // Takes the already allocated newToken and openDocToken and sets up an OpenDoc
- // style token.
- // Places a null descriptor in openDocToken as the "user token"
- //------------------------------------------------------------------------------
-
- static void NewODToken( ODNameResolver* me, ODOSLToken* openDocToken,
- ODPart* part, ODFrame* frame, OSLToken* newToken )
- {
- Environment* ev = somGetGlobalEnvironment();
- OSLContext context;
-
- WASSERT(openDocToken);
-
- // CHECK TO SEE IF THIS IS A NULL TOKEN
- DescType dt = openDocToken->GetDescType(ev);
- // ODBoolean okToOverwrite = (dt == 'dead') || (dt == typeNull);
- ODBoolean okToOverwrite = (dt == typeNull);
-
- // if (dt != 'dead' && dt != typeNull && dt != typeAEList &&
- // dt != typeObjectBeingExamined)
- // This ASSERT is bogus as the token can be anyone's mark token
- // if (dt != typeNull && dt != typeAEList && dt != typeObjectBeingExamined)
- // WARN("Some unknown descriptor type in NewODToken.");
-
- // MUST SAVE OFF ORIGINAL OSLToken FOR CERTAIN TOKENS.
- AEDesc savedToken;
- if ( !okToOverwrite )
- // what's there now MATTERS; save it for wrapping
- savedToken = *newToken;
- else
- MakeNULLDesc(&savedToken);
-
- // INITIALIZE OSLToken TO THE RIGHT THING.
- newToken->descriptorType = typeUserToken;
- // $$$$$ THIS KNOWLEDGE OF HOW BIG THE STRUCTURE IS SHOULD BE ENCAPSULATED
- // SOMEWHERE ELSE!!!!
- Handle h = (Handle)ODNewHandle(sizeof(ODDesc*) + sizeof(OSLContext));
- newToken->dataHandle = h;
- // GET AN OSLContext FOR THIS PART.
- me->GetContextForPart(ev, part, frame, &context);
- OSLSetTokenContext(newToken, &context);
-
- // CREATE USER TOKEN AND STICK IT IN THE OSLToken.
- ODDesc* tmpToken = new ODDesc();
- THROW_IF_NULL(tmpToken);
- tmpToken->InitODDesc(ev);
- THROW_IF_ERROR( AEDescToODDesc( &savedToken, tmpToken ) );
- SetUserODToken(newToken, tmpToken);
-
- // FINALLY INITIALIZE openDocToken AS WELL
- THROW_IF_ERROR( AEDescToODDesc(newToken, openDocToken ) );
- }
-
- //------------------------------------------------------------------------------
- // CopyContextIntoToken
- //
- // Move 2nd 8 bytes of dataHandle from one token to the other.
- // Should use OSLGetTokenContext and OSLSetTokenContext instead.
- //------------------------------------------------------------------------------
-
- static void CopyContextIntoToken(const OSLToken* sourceToken,
- OSLToken* destToken)
- {
- OSLContext context = GETBYTESOFHANDLE(sourceToken->dataHandle, OSLContext,
- sizeof(AEDesc));
-
- SETBYTESOFHANDLE(destToken->dataHandle, OSLContext, context,
- sizeof(AEDesc));
- }
-
- //------------------------------------------------------------------------------
- // TokenDefaultCanHandle
- //------------------------------------------------------------------------------
-
- static ODBoolean TokenDefaultCanHandle( Environment* ev,
- ODNameResolver* resolver, ODOSLToken* token )
- {
- ODBoolean result = kODFalse;
- AEDesc realToken;
- THROW_IF_ERROR( ODDescToAEDesc( token, &realToken ) );
- switch ( realToken.descriptorType )
- {
- case typeUserToken:
- if ( !resolver->TokenIsDefault(ev, &realToken) )
- {
- ODDesc* userToken;
- userToken = resolver->GetUserToken( ev, token );
- AEDesc realUserToken;
- THROW_IF_ERROR( ODDescToAEDesc( userToken, &realUserToken ) );
-
- ODBoolean isStandardToken =
- CanBeStandardPartToken( &realUserToken )
- || realUserToken.descriptorType == typeNull
- || realUserToken.descriptorType == typeObjectBeingExamined;
-
- AEDisposeDesc(&realUserToken);
-
- result = isStandardToken;
- }
- else
- result = kODTrue;
- break;
- case typeNull:
- result = kODTrue;
- break;
- }
- (void)AEDisposeDesc( &realToken );
- return result;
- }
-
- //------------------------------------------------------------------------------
- // GetCallObjectAccessor
- //
- // Used for compile-time type checking only.
- //------------------------------------------------------------------------------
-
- static ObjectAccessorCaller GetCallObjectAccessor()
- {
- return CallObjectAccessor;
- }
-
- //------------------------------------------------------------------------------
- // CallObjectAccessor
- //------------------------------------------------------------------------------
-
- static OSErr CallObjectAccessor(DescType desiredClass,
- const OSLToken* containerToken,
- DescType containerClass,
- DescType keyForm,
- const AEDesc* keyData,
- OSLToken* value,
- Boolean* procFound,
- long contextRefCon)
- {
- OSErr error = noErr;
- TempODSemanticInterface si = kODNULL;
- ODPart* thePart;
- Environment* ev = somGetGlobalEnvironment();
- ODNameResolver* nameResolver
- = ((SIContext*)contextRefCon)->GetNameResolver();
- ODFrame* const kNoFrameInfo = kODNULL;
- ODBoolean allocatedContainerToken = kODFalse;
-
- *procFound = false;
-
- TRY
- si = GetSI(contextRefCon, &thePart);
-
- ODDesc* dataODDesc = new ODDesc();
- THROW_IF_NULL(dataODDesc);
- dataODDesc->InitODDesc(ev);
- THROW_IF_ERROR( AEDescToODDesc( (AEDesc*)keyData, dataODDesc ));
-
- // INITIALIZE TOKENS (OPTIMIZATION?: SHOULD ONLY DO THIS IF WE CAN
- // ACTUALLY CALL AN OBJECT ACCESSOR.)
-
- ODOSLToken* containerODDesc = new ODOSLToken();
- THROW_IF_NULL(containerODDesc);
- containerODDesc->InitODOSLToken(ev);
- THROW_IF_ERROR(AEDescToODDesc((OSLToken*)containerToken,
- containerODDesc));
-
- ODOSLToken* valueWrapper = new ODOSLToken();
- THROW_IF_NULL(valueWrapper);
- valueWrapper->InitODOSLToken(ev);
-
- OSLContext context;
- GetCurrentContext(&context);
- ODFrame* frame = FrameFromContext(&context);
- ASSERT_FRAME_MATCHES_PART( ev, frame, thePart );
-
- if (!nameResolver->IsODToken(ev, valueWrapper))
- NewODToken( nameResolver, valueWrapper, thePart, frame, value);
-
- // HANDLE NULL CONTAINER TOKEN.
- if (!nameResolver->IsODToken(ev, containerODDesc))
- {
- NewODToken(nameResolver, containerODDesc, thePart,
- frame, (AEDesc*)containerToken);
- allocatedContainerToken = kODTrue;
- }
-
- if ( si )
- {
- TRY
- si->CallObjectAccessor(ev, thePart, (ODDescType)desiredClass,
- containerODDesc,
- (ODDescType)containerClass,
- (ODDescType)keyForm, dataODDesc,
- valueWrapper);
- SetIsDefaultToken(nameResolver, valueWrapper, kODFalse);
- CATCH_ALL
- error = ErrorCode();
- ENDTRY
- }
-
- if ( (error == errAEEventNotHandled || !si)
- && TokenDefaultCanHandle( ev, nameResolver, containerODDesc) )
- {
- ODMessageInterface* msgintf =
- nameResolver->GetSession(ev)->GetMessageInterface(ev);
- DefaultAccessorSI* defaultSI =
- (DefaultAccessorSI*)msgintf->GetDefaultSI(ev);
-
- TRY
- defaultSI->CallObjectAccessor(ev, thePart, desiredClass,
- containerODDesc, containerClass, keyForm,
- dataODDesc, valueWrapper);
- SetIsDefaultToken(nameResolver, valueWrapper, kODTrue);
- error = kODNoError;
- CATCH_ALL
- error = ErrorCode();
- ENDTRY
- }
-
- // <eeh> part of memory leak fixing though I no longer remember
- // quite what leak....
-
- if ( error == noErr )
- THROW_IF_ERROR( ODDescToAEDesc(valueWrapper, value) );
-
- ODDeleteObject(valueWrapper);
- ODDeleteObject(dataODDesc);
- if (allocatedContainerToken)
- {
- ODDesc* userToken = nameResolver->GetUserToken(ev, containerODDesc);
- DescType dt = nameResolver->GetUserToken(ev, containerODDesc)
- ->GetDescType(ev);
-
- // $$$$$ SHOULDN'T USE NEWODTOKEN FOR CONTAINERS. IT ALLOCATES
- // A AEDESC WHEN WE DON'T NEED IT. HERE WE CHECK TO SEE IF IT DID
- // THIS AND GET RID OF IT IF SO. FIX THIS!!!!!
- // if ( (dt == 'dead') || (dt == typeNull)
- // || (dt == typeObjectBeingExamined) )
- if ( (dt == typeNull) || (dt == typeObjectBeingExamined) )
- AEDisposeDesc((AEDesc*)containerToken);
-
- nameResolver->DisposeToken(ev, containerODDesc);
- }
- #define FIX_FOR_EVERY_LEAK 1
- #if FIX_FOR_EVERY_LEAK
- else
- ODDeleteObject(containerODDesc);
- #endif
- CATCH_ALL
- error = ErrorCode();
- ENDTRY
-
- return error;
- }
-
- //------------------------------------------------------------------------------
- // GetGetAppDoesFlags
- //
- // Used for compile-time type checking only.
- //------------------------------------------------------------------------------
-
- static CallbackFlagsGetter GetGetAppDoesFlags()
- {
- return GetAppDoesFlags;
- }
-
- //------------------------------------------------------------------------------
- // GetAppDoesFlags
- //------------------------------------------------------------------------------
-
- static long GetAppDoesFlags(long contextRefCon)
- {
- ODPart* thePart;
- TempODSemanticInterface si = GetSI(contextRefCon, &thePart);
-
- if( !si )
- return kAEIDoMinimum;
- else
- {
- Environment* ev = somGetGlobalEnvironment();
- long result = si->GetOSLSupportFlags(ev);
- return result;
- }
- }
-
- //------------------------------------------------------------------------------
- // GetSpecialProc
- //
- // Lookup special proc given a context. Return kODFalse if not found, kODTrue
- // otherwise.
- //------------------------------------------------------------------------------
- #if 0
- static ODBoolean GetSpecialProc(long contextRefCon,
- ODSemanticInterface*& si,
- ODPart*& thePart)
- {
- si = GetSI(contextRefCon, &si, &thePart);
- if( !si )
- return kODFalse;
-
- // theSI->GetSpecialHandler(funcType, &proc, &refCon);
-
- // if (!proc)
- // return kODFalse;
-
- return kODTrue;
- }
- #endif
- //------------------------------------------------------------------------------
- // CallCountProcAux
- //------------------------------------------------------------------------------
-
- static void CallCountProcAux(DescType desiredClass,
- DescType containerClass,
- const OSLToken* container,
- long* result,
- long contextRefCon,
- ODOSLToken* containerWrapper)
- {
- ODPart* thePart;
- Environment* ev = somGetGlobalEnvironment();
- OSErr error = noErr;
- ODOSLToken* newContainerWrapper = kODNULL;
- ODNameResolver* nameResolver
- = ((SIContext*)contextRefCon)->GetNameResolver();
-
- {
- TempODSemanticInterface si = GetSI(contextRefCon, &thePart);
-
- // TRY WITH THE PART'S SI FIRST
- if (si)
- {
- TRY
- si->CallCountProc(ev, thePart, desiredClass, containerClass,
- containerWrapper, (ODSLong*)result);
- CATCH_ALL
- error = ErrorCode();
- ENDTRY
- } else
- error = errAEEventNotHandled;
- }
-
- // SOME ERROR OCCURRED. TRY DEFAULT SI
- if (error == errAEEventNotHandled
- && TokenDefaultCanHandle( ev, nameResolver, containerWrapper))
- {
- TRY
- ODMessageInterface* msgintf =
- nameResolver->GetSession(ev)->GetMessageInterface(ev);
- DefaultAccessorSI* defaultSI =
- (DefaultAccessorSI*)msgintf->GetDefaultSI(ev);
-
- defaultSI->CallCountProc(ev, thePart, desiredClass,
- containerClass, containerWrapper,
- (ODSLong*)result);
- error = noErr;
- CATCH_ALL
- error = ErrorCode();
- ENDTRY
-
- THROW_IF_ERROR( error );
- }
- }
-
- //------------------------------------------------------------------------------
- // GetCallCountProc
- //
- // Used for compile-time type checking only.
- //------------------------------------------------------------------------------
-
- static CountProcCaller GetCallCountProc()
- {
- return CallCountProc;
- }
-
- //------------------------------------------------------------------------------
- // CallCountProc
- //------------------------------------------------------------------------------
-
- static OSErr CallCountProc(DescType desiredClass,
- DescType containerClass,
- const OSLToken* container,
- long* result,
- long contextRefCon)
- {
- Environment* ev = somGetGlobalEnvironment();
- OSErr error = noErr;
- ODOSLToken* newContainerWrapper = kODNULL;
- ODDesc* userToken = kODNULL;
- AEDesc userTokenAsAEDesc;
- OSLContext savedCurContext;
- OSLContext newContext;
- ODFrame* theFrame;
- ODNameResolver* nameResolver
- = ((SIContext*)contextRefCon)->GetNameResolver();
- ODBoolean allocatedContainerToken = kODFalse;
-
- TRY
- // SET UP ODDESC FOR CONTAINER
- ODOSLToken* containerWrapper = new ODOSLToken();
- THROW_IF_NULL(containerWrapper);
- containerWrapper->InitODOSLToken(ev);
- THROW_IF_ERROR(AEDescToODDesc((AEDesc*)container, containerWrapper));
-
- // INITIALIZE CONTAINER TOKEN TO OPENDOC TOKEN
- // GET USER TOKEN SO THAT WE CAN LOOK AT IT
- // WE ASSUME HERE THAT ONLY TIME THIS CAN HAPPEN IN WHEN THE SHELL IS
- // INVOLVED.
- if (!nameResolver->IsODToken(ev, containerWrapper))
- {
- NewODToken(nameResolver, containerWrapper, kODAppShell, kODNULL,
- (OSLToken*)container);
- allocatedContainerToken = kODTrue;
- MakeNULLToken(&userTokenAsAEDesc); // container?
- }
- else
- {
- userToken = nameResolver->GetUserToken(ev, containerWrapper);
- THROW_IF_ERROR(ODDescToAEDesc(userToken, &userTokenAsAEDesc));
- }
-
- TRY
- CallCountProcAux(desiredClass, containerClass, container, result,
- contextRefCon, containerWrapper);
- CATCH_ALL
- error = ErrorCode();
- ENDTRY
-
- // TRY SWAPPING TO EMBEDDED FRAME IF THE PART RETURNS THE SPECIAL
- // "SWAP" RESULT.
-
- // NORMALLY, WE SHOULD ONLY ALLOW SWAPPING IF THE CONTAINER IS A
- // STANDARD PART TOKEN. HOWEVER, WHEN thePart IS kODNULL, THEN WE
- // KNOW THAT THE APPLICATION IS THE CONTAINER AND THE REQUEST TO
- // SWAP SHOULD BE TRANSLATED INTO A SWAP TO THE ROOT PART.
-
- // IS THERE ANOTHER CASE WE HAVE TO WORRY ABOUT?
-
- if (*result == kODCountProcSwapValue && error == noErr)
- {
- ODPart* thePart = kODNULL;
- if ( CanBeStandardPartToken( &userTokenAsAEDesc ) )
- {
- PartFrameFromStandardPartToken( &userTokenAsAEDesc, &thePart,
- &theFrame );
- thePart->Acquire(ev);
- }
- else
- {
- theFrame = GetDefaultRootFrameToSwapTo(ev,
- nameResolver->GetSession(ev));
- thePart = theFrame->AcquirePart(ev);
- }
-
- { TempODPart tempPart = thePart; // ensure it's released
-
- THROW_IF_ERROR(GetCurrentContext(&savedCurContext));
-
- nameResolver->GetContextForPart(ev, thePart, theFrame,
- &newContext);
- }
-
- THROW_IF_ERROR(SetCurrentContext(&newContext));
-
- TRY
- // SET UP A NULL CONTAINER.
-
- // SET THE USER TOKEN TO NULL AND SET THE CONTEXT OF THE
- // TOKEN TO THE RIGHT THING.
-
- ODDesc* tempODDesc = new ODDesc();
- THROW_IF_NULL(tempODDesc);
- tempODDesc->InitODDesc(ev);
-
- #define FIX_FOR_WHOSE_LEAK 1
- #if FIX_FOR_WHOSE_LEAK
- // SAVE OLD CONTAINER ODOSLTOKEN
- ODOSLToken* oldContainerWrapper = containerWrapper;
-
- containerWrapper = new ODOSLToken();
- THROW_IF_NULL(containerWrapper);
- containerWrapper->InitODOSLToken(ev);
- #endif
-
- SetUserODToken((OSLToken*)container, tempODDesc);
- OSLSetTokenContext((OSLToken*)container, &newContext);
- THROW_IF_ERROR( AEDescToODDesc( (AEDesc*)container, containerWrapper ) );
-
- // RESET CONTAINER CLASS
- containerClass = typeNull;
-
- TRY
- CallCountProcAux(desiredClass, containerClass, container,
- result, newContext.refCon,
- containerWrapper);
- CATCH_ALL
- error = ErrorCode();
- ENDTRY
- // RESTORE PREVIOUS USER TOKEN. Restore even in case
- // of error so dispose will Release Frame and Part (for
- // the common case where we tried swapping to a StdPartToken.
-
- #if FIX_FOR_WHOSE_LEAK
- nameResolver->DisposeToken(ev, containerWrapper);
- containerWrapper = oldContainerWrapper;
- #endif
-
- SetUserODToken((OSLToken*)container, userToken);
- THROW_IF_ERROR(error);
- if ( *result == kODCountProcSwapValue )
- THROW( errAEEventNotHandled );
- CATCH_ALL
- THROW_IF_ERROR(SetCurrentContext(&savedCurContext));
- RERAISE;
- ENDTRY
-
- THROW_IF_ERROR(SetCurrentContext(&savedCurContext));
- }
-
- if (allocatedContainerToken)
- nameResolver->DisposeToken(ev, containerWrapper);
- CATCH_ALL
- error = ErrorCode();
- ENDTRY
-
- (void)AEDisposeDesc( &userTokenAsAEDesc );
- return error;
- }
-
- //------------------------------------------------------------------------------
- // GetCallCompareProc
- //
- // Used for compile-time type checking only.
- //------------------------------------------------------------------------------
-
- static CompareProcCaller GetCallCompareProc()
- {
- return CallCompareProc;
- }
-
- //------------------------------------------------------------------------------
- // CallCompareProc
- //------------------------------------------------------------------------------
-
- static ODOSLToken* MakeODOSLToken( Environment* ev, ODNameResolver* nameResolver,
- ODPart* part, ODFrame* frame, const AEDesc* desc );
- static ODOSLToken* MakeODOSLToken( Environment* ev, ODNameResolver* nameResolver,
- ODPart* part, ODFrame* frame, const AEDesc* desc )
- {
- ODOSLToken* result = new ODOSLToken();
- THROW_IF_NULL(result);
- result->InitODOSLToken(ev);
-
- if ( noErr == AEDescToODDesc( (OSLToken*)desc, result ) )
- {
- return result;
- }
- else
- {
- ODDeleteObject(result);
- return kODNULL;
- }
- }
-
- static OSErr CallCompareProc(DescType oper,
- const OSLToken* obj1,
- const OSLToken* obj2,
- ODBoolean* result,
- long contextRefCon)
- {
- OSErr error = noErr;
- TempODSemanticInterface si = kODNULL;
- Environment* ev = somGetGlobalEnvironment();
- ODPart* thePart;
- ODOSLToken* tokenWrapper1 = kODNULL; ODVolatile(tokenWrapper1);
- ODOSLToken* tokenWrapper2 = kODNULL; ODVolatile(tokenWrapper2);
- ODNameResolver* nameResolver
- = ((SIContext*)contextRefCon)->GetNameResolver();
-
- TRY
- si = GetSI( contextRefCon, &thePart );
- ODFrame* frame = ((SIContext*)contextRefCon)->GetFrame();
- tokenWrapper1 = MakeODOSLToken( ev, nameResolver, thePart, frame, obj1 );
- tokenWrapper2 = MakeODOSLToken( ev, nameResolver, thePart, frame, obj2 );
- CATCH_ALL
- error = ErrorCode();
- ENDTRY
-
- if ( !error )
- {
- if ( si )
- {
- TRY
- si->CallCompareProc( ev, thePart, oper, tokenWrapper1,
- tokenWrapper2, result );
- CATCH_ALL
- error = ErrorCode();
- ENDTRY
- }
-
- // don't touch the error code already returned. Return it if the
- // defaults fail.
- if ( !si || error == errAEEventNotHandled )
- // <eeh> what value means failed to compare?
- {
- TRY
- ODMessageInterface* msgintf =
- nameResolver->GetSession(ev)->GetMessageInterface(ev);
- DefaultAccessorSI* defaultSI =
- (DefaultAccessorSI*)msgintf->GetDefaultSI(ev);
- defaultSI->CallCompareProc( ev, thePart, oper, tokenWrapper1,
- tokenWrapper2, result );
- // If we got here, there was no error.
- error = noErr;
- CATCH_ALL
- error = ErrorCode();
- ENDTRY
- }
- }
-
- ODDeleteObject(tokenWrapper1);
- ODDeleteObject(tokenWrapper2);
- return error;
- }
-
- //------------------------------------------------------------------------------
- // GetCallDisposeTokenProc
- //
- // Used for compile-time type checking only.
- //------------------------------------------------------------------------------
-
- static DisposeTokenProcCaller GetCallDisposeTokenProc()
- {
- return CallDisposeTokenProc;
- }
-
- //------------------------------------------------------------------------------
- // CallDisposeTokenProc
- //------------------------------------------------------------------------------
-
- static OSErr CallDisposeTokenProc(OSLToken* unneededToken,
- long contextRefCon)
- {
- TempODSemanticInterface si = kODNULL;
- ODPart* thePart;
- Environment* ev = somGetGlobalEnvironment();
- OSErr error = noErr;
- ODNameResolver* nameResolver
- = ((SIContext*)contextRefCon)->GetNameResolver();
- ODOSLToken* tokenWrapper = kODNULL; ODVolatile(tokenWrapper);
-
- TRY
- TRY
- si = GetSI( contextRefCon, &thePart );
- tokenWrapper = new ODOSLToken();
- THROW_IF_NULL(tokenWrapper);
- tokenWrapper->InitODOSLToken(ev);
- THROW_IF_ERROR( AEDescToODDesc( unneededToken, tokenWrapper ) );
- CATCH_ALL
- error = ErrorCode();
- ENDTRY
-
- if ( !error )
- {
- ODDesc* userToken = kODNULL;
-
- // GET A REFERENCE TO THE USER TOKEN (IF ANY) HERE, SO THAT WE STILL
- // HAVE A VALID REFERENCE TO IT IF THE USER'S DISPOSETOKEN PROC
- // DEALLOCATES THE ODOSLToken.
- if (nameResolver->IsODToken(ev, tokenWrapper)
- || (unneededToken->descriptorType == kSwitchDescType))
- userToken = GetUserODToken(unneededToken);
-
- TRY
- if ( si )
- si->CallDisposeTokenProc(ev, thePart, tokenWrapper);
- CATCH_ALL
- error = ErrorCode();
- ENDTRY
-
- if ( !si || (error == errAEEventNotHandled) )
- {
- TRY
- ODMessageInterface* msgintf =
- nameResolver->GetSession(ev)->GetMessageInterface(ev);
- DefaultAccessorSI* defaultSI =
- (DefaultAccessorSI*)msgintf->GetDefaultSI(ev);
- defaultSI->CallDisposeTokenProc(ev, thePart, tokenWrapper);
- CATCH_ALL
- error = ErrorCode();
- ENDTRY
- }
-
- // ALWAYS DELETE THE USER TOKEN
- if (userToken)
- delete userToken;
-
- // ONLY DELETE THE TOKEN ITSELF IF NO ONE ELSE HANDLED IT.
- if (error)
- {
- // WARN("No dispose token proc handled it. NameResolver handling.");
- ODDeleteObject(tokenWrapper);
- }
- }
- CATCH_ALL
- error = ErrorCode();
- ENDTRY
-
- // IF THERE WAS NO ERROR, MAKE SURE WE DISPOSE THE AEDESC, BUT THE OSL
- // WON'T. IT WILL IF WE RETURN AN ERROR.
- if (error == kODNoError)
- AEDisposeDesc(unneededToken);
-
- return error;
- }
-
- //------------------------------------------------------------------------------
- // GetMarkProc
- //
- // Used for compile-time type checking only.
- //------------------------------------------------------------------------------
-
- static MarkProcCaller GetMarkProc()
- {
- return CallMarkProc;
- }
-
- //------------------------------------------------------------------------------
- // CallMarkProc
- //------------------------------------------------------------------------------
-
- static OSErr CallMarkProc(const OSLToken* dToken,
- const OSLToken* markToken,
- long index,
- long contextRefCon)
- {
- OSErr error = noErr;
- Environment* ev = somGetGlobalEnvironment();
- ODPart* thePart;
- ODNameResolver* nameResolver
- = ((SIContext*)contextRefCon)->GetNameResolver();
-
- TempODSemanticInterface si = GetSI(contextRefCon, &thePart);
- if( !si )
- return errAENotASpecialFunction;
-
- ODOSLToken* tokenWrapper = kODNULL; ODVolatile(tokenWrapper);
- ODOSLToken* markTokenWrapper = kODNULL; ODVolatile(markTokenWrapper);
- TRY
- tokenWrapper = new ODOSLToken();
- THROW_IF_NULL(tokenWrapper);
- tokenWrapper->InitODOSLToken(ev);
- THROW_IF_ERROR( AEDescToODDesc( (OSLToken*)dToken, tokenWrapper ) );
-
- markTokenWrapper = new ODOSLToken();
- THROW_IF_NULL(markTokenWrapper);
- markTokenWrapper->InitODOSLToken(ev);
- THROW_IF_ERROR(AEDescToODDesc( (OSLToken*)markToken, markTokenWrapper));
- si->CallMarkProc(ev, thePart, tokenWrapper,
- markTokenWrapper, index);
- CATCH_ALL
- error = ErrorCode();
- ENDTRY
-
- ODDeleteObject(tokenWrapper);
- ODDeleteObject(markTokenWrapper);
- return error;
- }
-
- //------------------------------------------------------------------------------
- // GetMarkTokenProc
- //
- // Used for compile-time type checking only.
- //------------------------------------------------------------------------------
-
- static GetMarkTokenProcCaller GetMarkTokenProc()
- {
- return CallGetMarkTokenProc;
- }
-
- //------------------------------------------------------------------------------
- // CallGetMarkTokenProc
- //------------------------------------------------------------------------------
-
- static OSErr CallGetMarkTokenProc(const OSLToken* dContainerToken,
- DescType containerClass,
- OSLToken* result,
- long contextRefCon)
- {
- OSErr error = noErr;
- Environment* ev = somGetGlobalEnvironment();
- ODPart* thePart;
- ODNameResolver* nameResolver
- = ((SIContext*)contextRefCon)->GetNameResolver();
-
- TempODSemanticInterface si = GetSI(contextRefCon, &thePart);
- if( !si )
- return errAENotASpecialFunction;
-
- ODOSLToken* tokenWrapper = kODNULL; ODVolatile(tokenWrapper);
- TRY
- tokenWrapper = new ODOSLToken();
- THROW_IF_NULL(tokenWrapper);
- tokenWrapper->InitODOSLToken(ev);
- THROW_IF_ERROR( AEDescToODDesc( (OSLToken*)dContainerToken, tokenWrapper ) );
-
- ODOSLToken* resultWrapper = new ODOSLToken();
- THROW_IF_NULL(resultWrapper);
- resultWrapper->InitODOSLToken(ev);
- si->CallGetMarkTokenProc(ev, thePart, tokenWrapper,
- containerClass,
- resultWrapper);
- THROW_IF_ERROR( ODDescToAEDesc(resultWrapper, result));
- ODDeleteObject(resultWrapper);
- CATCH_ALL
- error = ErrorCode();
- ENDTRY
-
- ODDeleteObject(tokenWrapper);
- return error;
- }
-
- //------------------------------------------------------------------------------
- // GetAdjustMarksProc
- //
- // Used for compile-time type checking only.
- //------------------------------------------------------------------------------
-
- static AdjustMarksProcCaller GetAdjustMarksProc()
- {
- return CallAdjustMarksProc;
- }
-
- //------------------------------------------------------------------------------
- // CallAdjustMarksProc
- //------------------------------------------------------------------------------
-
- static OSErr CallAdjustMarksProc(long newStart,
- long newStop,
- const OSLToken* markToken,
- long contextRefCon)
- {
- OSErr error = noErr;
- Environment* ev = somGetGlobalEnvironment();
- ODPart* thePart;
-
- TempODSemanticInterface si = GetSI(contextRefCon, &thePart);
- if (!si)
- return errAENotASpecialFunction;
-
- ODOSLToken* tokenWrapper = kODNULL; ODVolatile(tokenWrapper);
- TRY
- tokenWrapper = new ODOSLToken();
- THROW_IF_NULL(tokenWrapper);
- tokenWrapper->InitODOSLToken(ev);
- THROW_IF_ERROR( AEDescToODDesc( (OSLToken*)markToken, tokenWrapper ) );
-
- si->CallAdjustMarksProc(ev, thePart, newStart, newStop,
- tokenWrapper);
- CATCH_ALL
- error = ErrorCode();
- ENDTRY
-
- ODDeleteObject(tokenWrapper);
- return error;
- }
-
- //------------------------------------------------------------------------------
- // GetGetErrDescProc
- //
- // Used for compile-time type checking only.
- //------------------------------------------------------------------------------
-
- static GetErrDescProcCaller GetGetErrDescProc()
- {
- return CallGetErrDescProc;
- }
-
- //------------------------------------------------------------------------------
- // CallGetErrDescProc
- //------------------------------------------------------------------------------
-
- static OSErr CallGetErrDescProc(AEDesc** appDescPtr,
- long contextRefCon)
- {
- TempODSemanticInterface si = kODNULL;
- ODPart* thePart;
- Environment* ev = somGetGlobalEnvironment();
- OSErr error = noErr;
- ODNameResolver* nameResolver
- = ((SIContext*)contextRefCon)->GetNameResolver();
-
- si = GetSI(contextRefCon, &thePart);
- if (!si)
- return errAENotASpecialFunction;
-
- TRY
- ODDesc* errorODDesc;
- si->CallGetErrDescProc(ev, thePart, &errorODDesc);
- *appDescPtr = nameResolver->AddErrDescToList(ev, errorODDesc);
- CATCH_ALL
- error = ErrorCode();
- ENDTRY
- return error;
- }
-
-